package saei.service;

import java.util.ArrayList;
import java.util.List;
import java.util.Hashtable;

import saei.bean.parametros.Ciudad;
import saei.bean.parametros.MarcaEquipo;
import saei.bean.parametros.MarcaSoftware;
import saei.bean.parametros.ModeloCpu;
import saei.bean.parametros.ModeloImpresora;
import saei.bean.parametros.ModeloMonitor;
import saei.bean.parametros.ModeloUps;
import saei.bean.parametros.ModoImpresion;
import saei.bean.parametros.Parametro;
import saei.bean.parametros.Procesador;
import saei.bean.parametros.Proveedor;
import saei.bean.parametros.Provincia;
import saei.bean.parametros.Sector;
import saei.bean.parametros.TipoConectividad;
import saei.bean.parametros.TipoPantalla;
import saei.bean.vo.ParametroVO;
import saei.persistencia.DAO.EntidadPersistenteDAO;

@SuppressWarnings({"unchecked", "rawtypes"})
public class ServiciosParametro 
{
	private static ServiciosParametro instancia;
	private Hashtable<String, Hashtable> parametros;
	
	private ServiciosParametro() throws ClassNotFoundException {
		//Creo la tabla y agrego cada tipo de parametro
		parametros = new Hashtable<String, Hashtable>();
		
		parametros.put(MarcaEquipo.class.getName(), new Hashtable<String, MarcaEquipo>());
		parametros.put(ModeloCpu.class.getName(), new Hashtable<String, ModeloCpu>());
		parametros.put(ModeloImpresora.class.getName(), new Hashtable<String, ModeloImpresora>());
		parametros.put(ModeloUps.class.getName(), new Hashtable<String, ModeloUps>());
		parametros.put(ModeloMonitor.class.getName(), new Hashtable<String, ModeloMonitor>());
		parametros.put(Procesador.class.getName(), new Hashtable<String, Procesador>());
		parametros.put(TipoPantalla.class.getName(), new Hashtable<String, TipoPantalla>());
		parametros.put(MarcaSoftware.class.getName(), new Hashtable<String, MarcaSoftware>());
		parametros.put(ModoImpresion.class.getName(), new Hashtable<String, ModoImpresion>());
		parametros.put(TipoConectividad.class.getName(), new Hashtable<String, TipoConectividad>());
		parametros.put(Sector.class.getName(), new Hashtable<String, Sector>());
		parametros.put(Provincia.class.getName(), new Hashtable<String, Provincia>());
		parametros.put(Ciudad.class.getName(), new Hashtable<String, Ciudad>());
		parametros.put(Proveedor.class.getName(), new Hashtable<String, Proveedor>());
		
		//Leer los parametros almacenados en la DB
        for (String tipoParametro : parametros.keySet()) {
        	Hashtable contenedor = parametros.get(tipoParametro);
        	
        	List<Parametro> allParams = (List<Parametro>) 
        			EntidadPersistenteDAO.buscarPorClase(Class.forName(tipoParametro) , "descripcion");
        	for (Parametro parametro : allParams) 
    		{
        		contenedor.put(parametro.getCodigo(), parametro);
    		}
		}
	}
	
	public static ServiciosParametro getInstancia() {
		if (instancia == null)
			try {
				instancia = new ServiciosParametro();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		
		return instancia;
	}
	
	
	public List<MarcaEquipo> getMarcasEquipo() {
		Hashtable contenedor = parametros.get(MarcaEquipo.class.getName());
		return new ArrayList<MarcaEquipo>(contenedor.values());
	}
	
	public List<ModeloCpu> getModelosCpu() {
		Hashtable contenedor = parametros.get(ModeloCpu.class.getName());
		return new ArrayList<ModeloCpu>(contenedor.values());
	}
	
	public List<ModeloImpresora> getModelosImpresora() {
		Hashtable contenedor = parametros.get(ModeloImpresora.class.getName());
		return new ArrayList<ModeloImpresora>(contenedor.values());
	}
	
	public List<ModeloUps> getModelosUps() {
		Hashtable contenedor = parametros.get(ModeloUps.class.getName());
		return new ArrayList<ModeloUps>(contenedor.values());
	}
	
	public List<ModeloMonitor> getModelosMonitor() {
		Hashtable contenedor = parametros.get(ModeloMonitor.class.getName());
		return new ArrayList<ModeloMonitor>(contenedor.values());
	}
	
	public List<Procesador> getProcesadores() {
		Hashtable contenedor = parametros.get(Procesador.class.getName());
		return new ArrayList<Procesador>(contenedor.values());
	}
	
	public List<TipoPantalla> getTiposPantalla() {
		Hashtable contenedor = parametros.get(TipoPantalla.class.getName());
		return new ArrayList<TipoPantalla>(contenedor.values());
	}
	
	public List<MarcaSoftware> getMarcasSoftware() {
		Hashtable contenedor = parametros.get(MarcaSoftware.class.getName());
		return new ArrayList<MarcaSoftware>(contenedor.values());
	}
	
	public List<ModoImpresion> getModosImpresion() {
		Hashtable contenedor = parametros.get(ModoImpresion.class.getName());
		return new ArrayList<ModoImpresion>(contenedor.values());
	}
	
	public List<TipoConectividad> getTiposConectividad() {
		Hashtable contenedor = parametros.get(TipoConectividad.class.getName());
		return new ArrayList<TipoConectividad>(contenedor.values());
	}
	
	public List<Sector> getSectores() {
		Hashtable contenedor = parametros.get(Sector.class.getName());
		return new ArrayList<Sector>(contenedor.values());
	}
	
	public List<Provincia> getProvincias() {
		Hashtable contenedor = parametros.get(Provincia.class.getName());
		return new ArrayList<Provincia>(contenedor.values());
	}
	
	public List<Ciudad> getCiudades() {
		Hashtable contenedor = parametros.get(Ciudad.class.getName());
		return new ArrayList<Ciudad>(contenedor.values());
	}
	
	public List<Proveedor> getProveedores() {
		Hashtable contenedor = parametros.get(Proveedor.class.getName());
		return new ArrayList<Proveedor>(contenedor.values());
	}
	
	public static List getParametrosPorTipo(Class tipo) {
		return EntidadPersistenteDAO.buscarPorClase(tipo , "descripcion");
	}
	
	public static Parametro getParametroPorTipoCodigo(Class tipo, String codigo) {
		Hashtable<String, Parametro> contenedor = getInstancia().parametros.get(tipo.getName());		
		return contenedor != null && codigo != null ? contenedor.get(codigo) : null;
	}
	
	public static List<ParametroVO> getParametroVoPorTipo(Class tipo) {
		List<Parametro> parametros = ServiciosParametro.getParametrosPorTipo(tipo);
		ArrayList<ParametroVO>  lista = new ArrayList<ParametroVO>();
		for (Parametro parametro : parametros) {
			lista.add(parametro.getVO());
		}
		
		return lista;
	}
}